import Foundation


/*
 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 示例 1:

 输入: s = "abcabcbb"
 输出: 3
 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 
 
 示例 2:

 输入: s = "bbbbb"
 输出: 1
 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 
 
 示例 3:

 输入: s = "pwwkew"
 输出: 3
 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 
 
 示例 4:

 输入: s = ""
 输出: 0

 */


// O(n) O(1)
func noRepeatStr(_ s: String) -> Int {
    var dict = [Character: Int]()
    var result = 0
    var left = 0
    for i in 0..<s.count {
        let c = s[s.index(s.startIndex, offsetBy: i)]
        // 已经有重复了
        if let j = dict[c] {
            left = max(left, j + 1)
        }
        result = max(result, i - left + 1)
        dict[c] = i
    }
    return result
}

var str = "dvdf" // vdf
str = "dvadaf" //
str = "bbbbb"
str = "abcabcbb"
str = "abba"

let result = noRepeatStr(str)
print(result)
